package com.cn.qtms.util;


import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Slf4j
/**
 * @Name:BeanUtils
 * @Description:
 * @Author: zhangyang
 * @Date: 2019-08-26 23:45
 **/
public  class BeanUtils<T> {
	

	/**
	 * 将list中的map组装成list<vo>
	 * @param list
	 * @param t
	 * @return
	 */
	public  List<T> parseListToVo(List<Map<String, Object>> list, T t) {
		List<T> lt = new ArrayList<T>();

		for (int i = 0; i < list.size(); i++) {
			lt.add(parseMapToVo(list.get(i), t));
		}

		return lt;
	}

	
	/**
	 * 通过反射机制将map中的key对应value注入到vo中
	 * @param map
	 * @param t
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public T parseMapToVo(Map<String,Object> map, T t){
		Object obj = null;
		try{
			Class<?> cl = t.getClass();
			obj = cl.newInstance();
			Field[] fields = cl.getDeclaredFields();
			Iterator<String> it = map.keySet().iterator();
			while (it.hasNext()) {
				String fieldName = it.next();
				for(Field f: fields){
					if(f.getName().equalsIgnoreCase(deleteHorizontalLine(fieldName))){
						// 判断类型是否一致，调用反射注入值，
						String methodName = "set"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);
						Method inMethod = cl.getMethod(methodName, new Class[] { f.getType() });	
						if(map.get(fieldName)!=null){
							if(String.class.getName().equals(f.getType().getName())){
								//如果是String类型 不管map里面是什么类型都可以转换
								inMethod.invoke(obj,map.get(fieldName).toString());
							}else{
								inMethod.invoke(obj,convertValType(map.get(fieldName),f.getType()));
							}
						}
					}
				}
			}
		}catch(Exception e){
			log.error("ParseUtils parseMapToVo error.");
			log.error(e.getMessage());
			
		}
		return (T) obj;
	}
	
	/**
	 * 字段类型
	 * @param value
	 * @param fieldType
	 * @return
	 */
	private static Object convertValType(Object value, Class<?> fieldType) {
		Object retVal = null;
		if (Long.class.getName().equals(fieldType.getName()) || long.class.getName().equals(fieldType.getName())) {
			retVal = Long.parseLong(value.toString());
		} else if (Integer.class.getName().equals(fieldType.getName())
				|| int.class.getName().equals(fieldType.getName())) {
			retVal = Integer.parseInt(value.toString());
		} else if (Float.class.getName().equals(fieldType.getName())
				|| float.class.getName().equals(fieldType.getName())) {
			retVal = Float.parseFloat(value.toString());
		} else if (Double.class.getName().equals(fieldType.getName())
				|| double.class.getName().equals(fieldType.getName())) {
			retVal = Double.parseDouble(value.toString());
		} else if (Boolean.class.getName().equals(fieldType.getName())
				|| boolean.class.getName().equals(fieldType.getName())) {
			retVal = Boolean.parseBoolean(value.toString());
		} else if (Character.class.getName().equals(fieldType.getName())
				|| char.class.getName().equals(fieldType.getName())) {
			retVal = value;
		} else if(Date.class.getName().equals(fieldType.getName())){
			retVal = DateUtils.tryParse(value);
		} else if(String.class.getName().equals(fieldType.getName())){
			retVal = value;
		} else if (BigDecimal.class.getName().equals(fieldType.getName())){
			retVal=(BigDecimal) value;
		}
		return retVal;
	}
	


	/**
	 * 去除数据库字段名中的下划线
	 * @param str
	 * @return
	 */
	public static String deleteHorizontalLine(String str) {
        return str.replace("_", "");
    }	

}
